package org.example.reflection;

import java.lang.reflect.Constructor;

/**
 * @author: ZhuYouBin
 * @date: 2022/4/7 16:11
 * @description:
 */
public class ConstructorDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        // 1、创建 Class类对象
        Class<?> clazz = Class.forName("org.example.reflection.Student");
        // 2、获取构造方法
        // getConstructors(): 获取当前类中所有public的构造方法
        System.out.println("===== getConstructors(): 获取当前类中所有public的构造方法 =====");
        Constructor<?>[] constructors = clazz.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println();

        // getDeclaredConstructors(): 获取当前类中的所有构造方法
        System.out.println("===== getDeclaredConstructors(): 获取当前类中的所有构造方法 =====");
        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        System.out.println();

        // getConstructor(Class... args): 获取当前类中指定的参数个数的public构造方法
        System.out.println("===== getConstructor(Class... args): 获取当前类中指定参数个数的public构造方法 =====");
        // 获取指定参数的构造方法
        Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
        System.out.println(constructor);

        System.out.println();
        // getDeclaredConstructor(Class... args): 获取当前类中指定参数个数的构造方法（修饰符不限制）
        System.out.println("===== getDeclaredConstructor(Class... args): 获取当前类中指定参数个数的构造方法（修饰符不限制） =====");
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
    }
}
